package gt

import (
	"gitee.com/dark.H/gs"
	"github.com/mattn/go-runewidth"
	"github.com/nsf/termbox-go"
)

type PanelText struct {
	*PanelHandler
	Cursor   int
	Mode     int
	Buffer   gs.Str
	InputPre gs.Str
}

func NewPanelText(buf gs.Str) *PanelText {
	p := &PanelText{
		PanelHandler: NewPanelHandler(),
		Buffer:       buf,
		InputPre:     gs.Str("Typed >").Color("B", "y", "U"),
	}
	p.SetDrawFunc(p.show)
	p.key()
	return p
}

func (t *PanelText) GetWrapText() gs.Str {
	return gs.Str(runewidth.Wrap(string(t.Buffer), t.Width))
}

func (t *PanelText) Insert(msg gs.Str) *PanelText {
	t.Buffer += msg
	// lx, ly := t.Loc()
	// line := y - ly
	// col := x - lx
	// oldtext := t.Buffer
	// alltext := t.GetWrapText()
	// // wrapAllLineEndLocs :=  alltext.IndexAll("\n")

	// alltext.TextEveryLineWith(func(lineno int, oldLine gs.Str) gs.Str {
	// 	if lineno == line{
	// 		return oldLine[:col] + msg + oldLine[col:]
	// 	}else{
	// 		return oldLine
	// 	}
	// })
	// runewidth.Wrap()
	return t
}

func (t *PanelText) key() {
	t.OnkeyCtrlC(func(parentPanel *PanelHandler) bool {
		// gs.Str("typed : ch: %v key:%v ").F(ev.Ch, ev.Key).ToFile("/tmp/typed.txt")

		if t.Mode == 0 {
			// t.Buffer += "Mode:0 \n"
			t.CmdMode()
		} else {
			// t.Buffer += "Mode:1 \n"
			t.InputMode()
		}
		return false
	}).OnClick(func(x, y int, panel *PanelHandler) bool {
		if t.Mode == 0 {
			termbox.SetCursor(x, y)
			gs.Str("[Cut in %d %d]").F(x, y).Print()
		}
		return false

	}).Onkey(termbox.KeyCtrlI, func(parentPanel *PanelHandler) bool {
		x, y := parentPanel.Loc()
		_, h := parentPanel.InnerSize()
		t.Switch(func(parentPanel *PanelHandler) bool {
			for {
				t.Draw()
				some := QuickInput(x+1, y+h, gs.Str(t.InputPre).Color("U", "y"))
				if some == "exit" || some == "" {
					break
				}
				t.Insert("\n>" + some)
				t.Draw()
			}
			return false
		})
		return false

	})
}

func (t *PanelText) InputMode() *PanelText {
	t.Mode = 0
	return t
}

func (t *PanelText) CmdMode() *PanelText {
	t.Mode = 1
	return t
}

func (t *PanelText) show() {
	switch t.Mode {
	case 0:
		t.SetMouse(false)

	case 1:
		t.SetMouse(true)
	}
	buf := t.Buffer
	// buf := t.Buffer[:t.Cursor] + gs.Str(t.Buffer[t.Cursor]).ANSIUnderline() + t.Buffer[t.Cursor+1:]
	t.Write(buf)
}
